package main

import (
	"fmt"
	"reflect"
)

type Person01 struct {
	Name string
	Age  int
	Sex  string
}

func (p Person01) Say(msg string) {
	fmt.Println("hello", msg)
}

func (p Person01) PrintInfo() {
	fmt.Printf("姓名：%s，年龄：%d，性别：%s\n", p.Name, p.Age, p.Sex)
}

func main() {
	p1 := Person01{Name: "喜羊羊", Age: 18, Sex: "男"}
	getMessage(p1)
}

func getMessage(input interface{}) {
	getType := reflect.TypeOf(input)            //先获取 input 的类型
	fmt.Println("get Type is:", getType.Name()) //类型名称: Person01
	fmt.Println("get kind is:", getType.Kind()) //类型种类: struct

	getValue := reflect.ValueOf(input)          //获取 input 的数值
	fmt.Println("get all fields is:", getValue) //get all fields is: {喜羊羊 18 男}

	//获取字段
	/*
		step1: 先获取Type对象：reflect.Type,
			NumField()
			Field(index)
		step2: 通过Field()获取每一个Field字段
		step3: Interface()，得到对应的 Value
	*/
	for i := 0; i < getType.NumField(); i++ {
		field := getType.Field(i)
		value := getValue.Field(i).Interface() //获取第一个数值
		fmt.Printf("字段名称：%s，字段类型：%s，字段数值：%v\n", field.Name, field.Type, value)
	}

	//获取方法
	for i := 0; i < getType.NumMethod(); i++ {
		method := getType.Method(i)
		fmt.Printf("方法名称：%s，方法类型：%v\n", method.Name, method.Type)
	}
}
